#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

// 初始化向量
void init(float *v1, float *v2, int N) {
    for (int i = 0; i < N; i++) {
        v1[i] = i;
        v2[i] = i;
    }
}

// 输出结果
void output(float *p, int N) {
    for (int i = 0; i < N; i++) {
        printf("%f ", p[i]);
    }
    printf("\n");
}

// 向量乘法（使用OpenMP GPU加速）
void vec_mult(float *p, float *v1, float *v2, int N)
{
    init(v1, v2, N);
    
    #pragma omp target teams map(to: v1[0:N], v2[0:N]) map(from: p[0:N])
    #pragma omp distribute simd
    for (int i = 0; i < N; i++) {
        p[i] = v1[i] * v2[i];
    }
    
    output(p, N);
}

int main() {
    int N = 5;
    float *v1 = malloc(N * sizeof(float));
    float *v2 = malloc(N * sizeof(float));
    float *p = malloc(N * sizeof(float));

    vec_mult(p, v1, v2, N);

    free(v1);
    free(v2);
    free(p);
    return 0;
}